package com.jasen.springcloud.service;

import com.jasen.springcloud.entities.Dept;
import feign.hystrix.FallbackFactory;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * 整体资源快不够了，忍痛将某些服务先关掉，待渡过难关，再开启回来。
 * 注意：服务降级处理是在客户端实现完成的，与服务端没有关系。
 *
 * 此类编写完成后：
 *  1、在DeptConsumerService中配置fallbackFactory=DeptClientServiceFallbackFactory.class，如下：
 *  @FeignClient(value = "MICROSERVICECLOUD-DEPT",fallbackFactory=DeptClientServiceFallbackFactory.class)
 *  2、在microservicecloud-consumer-dept-feign-80的配置文件中添加如下配置：
 *      feign:
 *          hystrix:
 *              enabled: true
 *
 * 测试：
 * 	1).启动3个eureka集群配置（microservicecloud-eureka-7001系列）。
 * 	2).microservicecloud-provider-dept-8001启动。
 * 	3).microservicecloud-consumer-dept-feign-80启动。
 * 	4).在浏览器中输入：http://localhost/consumer/dept/get/1   进行测试。
 * 	5).故意关闭微服务microservicecloud-provider-dept-8001。
 * 	6).再浏览器中输入：http://localhost/consumer/dept/get/1   进行重新测试，此时服务端provider
 * 	    已经down了，但是我们做了服务降级处理，让客户端在服务端不可用时也会获得提示信息而不会挂起耗死服务器。
 */
@Component
public class DeptClientServiceFallbackFactory implements FallbackFactory<DeptConsumerService> {
    @Override
    public DeptConsumerService create(Throwable throwable) {
        return new DeptConsumerService() {

            /**
             * 测试服务降级
             * @param id
             * @return
             */
            @Override
            public Dept get(Long id) {
                return new Dept().setDeptno(id)
                        .setDname("该ID："+id+"没有没有对应的信息,Consumer客户端提供的降级信息,此刻服务Provider已经关闭")
                        .setDb_source("no this database in MySQL");
            }

            @Override
            public List<Dept> list() {
                return null;
            }

            @Override
            public Boolean add(Dept dept) {
                return null;
            }

            @Override
            public Object discovery() {
                return null;
            }
        };
    }
}